package com.cskaoyan.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.cskaoyan.component.Component1;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * @author stone
 * @date 2022/12/20 14:46
 */
@Configuration
@ComponentScan("com.cskaoyan")
public class SecondConfiguration {


    /**
     * 要通过这个方法注册一个DruidDataSource组件
     * @return 应该返回的是一个DruidDataSource的实例，这个返回值会注册为容器中的组件
     * 返回值的定义：可以写实现类，也可以写接口；提供组件的类型信息给到容器中；建议写接口
     * SE的代码风格来提供属性值就可以
     * 通过这种方式注册的组件id：1、默认值是方法名；2、@Bean注解的value属性可以指定组件id
     */
    @Bean
    public DataSource dataSource1(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/cskaoyan_db?useUnicode=true&characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

    @Bean
    public DataSource dataSource2(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/cskaoyan_db2?useUnicode=true&characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

    /**
     * Component1这个类中有一个成员变量 叫dataSource需要的是一个DataSource类型的组件
     * 设置的这个DataSource想要从容器中来获得
     * 形参：默认是按照类型从容器中取出组件的  ac.getBean(Class)
     * 如果形参所需的组件在容器中不止一个，需要额外指定组件id的信息 → @Qualifier 的value属性指定组件id
     * 形参的名称也可以作为组件的id，但是我们更建议使用@Qualifier ，更直观一些
     * @return
     */
    @Bean
    public Component1 component1(@Qualifier("dataSource2") DataSource dataSource) {
        Component1 component1 = new Component1();
        component1.setDataSource(dataSource);
        return component1;
    }
}
